from playwright.sync_api import Page, expect


def test_pw_click(page: Page):
    page.goto("/demo/button")
    page.get_by_text("点击我试试1").click(
        modifiers=["Control"]
    )  # 在点击的时候添加其他按键一起点击
    page.get_by_text("点击我试试1").click(
        position={"x": 10, "y": 15}
    )  # 根据坐标选择点击位置（位置不能超过元素的宽度和高度）,可以根据元素的.bounding_box()方法获取元素的大小
    page.get_by_text("点击我试试1").click(
        force=True
    )  # 强制点击，如果元素不可见，也可以点击
    page.get_by_text("点击我试试1").click(
        button="right"
    )  # 右键点击 ,可选值 "left", "middle", "right"
    page.get_by_text("点击我试试1").click(
        click_count=3, delay=1_000
    )  # click_count：点击次数，delay：延迟时间 指定在点击之前等待的时间（以毫秒为单位）
    page.get_by_text("点击我试试1").click(
        no_wait_after=True
    )  # no_wait_after：如果 noWaitAfter 设置为 true，则 Playwright 在执行操作后不会等待任何导航或动作完成。这意味着，如果点击操作触发了页面导航或其他异步事件，Playwright
    # 不会等待这些事件完成，而是立即继续执行后续的命令。如果 noWaitAfter 设置为 false（默认值），Playwright 会在执行操作后等待默认的时间（通常是 30
    # 秒），直到导航或动作完成。这确保了在执行后续操作之前，页面已经完成了所有相关的异步操作。


def test_pw_notification_message(page: Page):
    page.goto("/demo/button", wait_until="networkidle")
    page.get_by_text("点击我试试1").click()
    expect(page.get_by_text("点击成功1!")).to_be_visible()


def test_pw_new_page(page: Page):
    page.goto("/demo/link", wait_until="networkidle")
    page.get_by_text("本页跳转到百度").click()
    expect(page.get_by_text("百度一下", exact=True)).to_be_visible()
    page.goto("/demo/link", wait_until="networkidle")

    with page.expect_popup() as new_page:
        page.get_by_text("新页面跳转到淘宝").click()
    page_new = new_page.value
    expect(
        page_new.locator(".search-button")
    ).to_be_attached()  # to_be_attached() 检测元素是否被加载到dom中


def test_pw_hover(page: Page):
    # 鼠标悬浮操作
    page.goto("/demo/hover", wait_until="networkidle")
    # page.locator("#c4").hover()
    page.hover("#c4")
    expect(page.get_by_text("你已经成功悬浮")).to_be_visible()


def test_pw_dropdown(page: Page):
    # 下拉框操作 如果页面是正常的html的select 标签，那么可以直接使用page.select_option()方法

    page.goto("/demo/dropdown", wait_until="networkidle")
    page.get_by_text("点击选择").click(delay=1_000)
    page.get_by_text("playwright").click(delay=1_000)
    expect(page.get_by_text("你选择了websocket")).to_be_visible()
    page.get_by_text("点击选择").click(delay=1_000)
    page.get_by_text("selenium").click(delay=1_000)
    expect(page.get_by_text("你选择了webdriver")).to_be_visible()


def test_pw_input(page: Page):
    page.goto("/demo/input", wait_until="networkidle")
    page.get_by_placeholder("不用管我,我是placeholder").fill("小博测试成长之路")
    page.get_by_label("也许你可以通过label来定位input输入框").fill("lable定位")
    page.get_by_label("数字输入专用").fill("1.123456789012")
    page.get_by_label("数字输入专用").blur()
    page.wait_for_timeout(1_1000)
    assert page.get_by_label("数字输入专用").input_value() == "1.1234567890"


def test_pw_textarea(page: Page):
    page.goto("/demo/textarea", wait_until="networkidle")
    page.locator("textarea").fill("12345")
    page.wait_for_timeout(1_000)
    page.locator("textarea").fill("123\n45")
    page.wait_for_timeout(1_000)
    page.locator("textarea").fill(
        """123
456"""
    )
    expect(page.locator("textarea")).to_have_value("123\n456")
    page.locator("textarea").press_sequentially("789", delay=2_000)
    expect(page.locator("textarea")).to_have_value("123\n456789")


def test_pw_radio(page: Page):
    # 单选框操作
    page.goto("/demo/radio", wait_until="networkidle")
    page.get_by_text("草莓").locator("input").check()
    expect(page.get_by_text("草莓").locator("input")).to_be_checked()
    page.wait_for_timeout(1_000)
    page.get_by_text("香蕉").locator("input").check()
    expect(page.get_by_text("香蕉").locator("input")).to_be_checked()
    page.wait_for_timeout(1_000)
    page.get_by_text("苹果").locator("input").check()
    expect(page.get_by_text("苹果").locator("input")).to_be_checked()
    page.wait_for_timeout(1_000)


def test_pw_checkbox(page: Page):
    # checkbox    check()和set_checked()都可用于选中,也可以用click方法
    page.goto("/demo/checkbox", wait_until="networkidle")
    # page.get_by_text("开发").locator("input").set_checked(True)
    page.get_by_text("开发").locator("input").click()

    expect(page.get_by_text("开发").locator("input")).to_be_checked()
    page.wait_for_timeout(1_000)
    page.get_by_text("测试").locator("input").set_checked(True)
    expect(page.get_by_text("测试").locator("input")).to_be_checked()
    page.wait_for_timeout(1_000)
    page.get_by_text("美团").locator("input").set_checked(True)
    expect(page.get_by_text("美团").locator("input")).to_be_checked()
    page.wait_for_timeout(1_000)

    page.get_by_text("开发").locator("input").set_checked(False)
    expect(page.get_by_text("开发").locator("input")).not_to_be_checked()
    page.wait_for_timeout(1_000)
    page.get_by_text("测试").locator("input").set_checked(False)
    expect(page.get_by_text("测试").locator("input")).not_to_be_checked()
    page.wait_for_timeout(1_000)
    page.get_by_text("美团").locator("input").set_checked(False)
    expect(page.get_by_text("美团").locator("input")).not_to_be_checked()
    page.wait_for_timeout(1_000)

    page.get_by_text("开发").locator("input").check()
    expect(page.get_by_text("开发").locator("input")).to_be_checked()
    page.wait_for_timeout(1_000)


def test_pw_switch(page: Page):
    # switch开关
    page.goto("/demo/switch", wait_until="networkidle")
    page.locator('//div[@aria-checked]').click()
    expect(page.locator('//div[@aria-checked="true"]')).to_be_visible()
    expect(page.get_by_text("已经学会了~")).to_be_visible()
    page.locator('//div[@aria-checked]').click()
    expect(page.locator('//div[@aria-checked="false"]')).to_be_visible()
